www.gusucode.com > VC++网络版的打字软件源程序-源码程序 > VC++网络版的打字软件源程序-源码程序\code\TypeSrv V2.0\TypeSrvDoc.cpp

    //Download by http://www.NewXing.com
// TypeSrvDoc.cpp : implementation of the CTypeSrvDoc class
//

#include "stdafx.h"
#include "TypeSrv.h"

#include "TypeSrvDoc.h"
#include "TypeSrvView.h"
#include "MainView.h"

#include "QuestionDlg.h"
#include "ScoreDlg.h"

#include "LoginDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define DEFAULT_INPUT_LANGUAGE		0		//默认输入法:英文
#define DEFAULT_TEST_TIME			600		//默认测试时间:600秒(10分钟)
/////////////////////////////////////////////////////////////////////////////
// CTypeSrvDoc
#define PORT_DEFAULT 62248

#include "TypeSrvView.h"

IMPLEMENT_DYNCREATE(CTypeSrvDoc, CDocument)

BEGIN_MESSAGE_MAP(CTypeSrvDoc, CDocument)
	//{{AFX_MSG_MAP(CTypeSrvDoc)
	ON_COMMAND(ID_TYPESRV_LOGIN, OnTypesrvLogin)
	ON_COMMAND(ID_TYPESRV_LOGOUT, OnTypesrvLogout)
	ON_COMMAND(ID_QUESTION_DLG, OnQuestionDlg)
	ON_COMMAND(ID_SCORE_DLG, OnScoreDlg)
	ON_COMMAND(ID_DATA_BACKUP, OnDataBackup)
	ON_COMMAND(ID_DATA_RECOVER, OnDataRecover)
	ON_UPDATE_COMMAND_UI(ID_TYPESRV_LOGIN, OnUpdateTypesrvLogin)
	ON_UPDATE_COMMAND_UI(ID_TYPESRV_LOGOUT, OnUpdateTypesrvLogout)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTypeSrvDoc construction/destruction

CTypeSrvDoc::CTypeSrvDoc()
{
	// TODO: add one-time construction code here
	m_lID				= 0;
	m_strDate			= _T("");

	m_strQuestionInfo	= _T("");
	m_strQuestion		= _T("");
	m_lTestTime			= DEFAULT_TEST_TIME;
	m_nInputLanguage	= DEFAULT_INPUT_LANGUAGE;

	m_pListenSocket		= NULL;
	m_pSrvView			= NULL;
	m_pMainView			= NULL;

	m_bShowMainView		= TRUE;
	m_bLogin			= FALSE;
}

CTypeSrvDoc::~CTypeSrvDoc()
{
	if(m_pListenSocket!=NULL)
	{
		m_pListenSocket->Close();
		delete m_pListenSocket;
		m_pListenSocket=NULL;
	}
}

BOOL CTypeSrvDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	SetTitle("(作者:蔡良辉 CopyRight 2005-2006)");

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CTypeSrvDoc serialization

void CTypeSrvDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CTypeSrvDoc diagnostics

#ifdef _DEBUG
void CTypeSrvDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CTypeSrvDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTypeSrvDoc commands

void CTypeSrvDoc::UpdateUserInfo()
{
	
	UpdateAllViews(NULL);

}

void CTypeSrvDoc::OnTypesrvLogin() 
{
	// TODO: Add your command handler code here
	CString str;
	CLoginDlg dlg;
	if(dlg.DoModal()==IDOK)
	{
		m_pListenSocket=new CListenSocket;
		m_pListenSocket->SetTypeSrvDoc(this);

		if(m_pListenSocket->Create(PORT_DEFAULT))
		{
			if(!m_pListenSocket->Listen())
			{
				AfxMessageBox("侦听失败!");
				return;
			}
		}
		

		SetTitle("已启动网上考试");
		

		m_lID=dlg.m_lID;
		m_strQuestionInfo=dlg.m_strQuestionInfo;
		m_strQuestion=dlg.m_strQuestion;
		m_lTestTime=dlg.m_lTestTime*60;//转化为秒
		m_nInputLanguage=dlg.m_nInputLanguage;

		CTime tm=CTime::GetCurrentTime();
		m_strDate.Format("%d年%d月%d日",tm.GetYear(),tm.GetMonth(),tm.GetDay());
		
		m_bLogin=TRUE;

		if(!SwitchToView(RUNTIME_CLASS(CTypeSrvView)))
		{
			return;
		}
		m_bShowMainView=FALSE;

		m_pSrvView->ShowQuestion(m_strDate,m_strQuestionInfo,m_strQuestion);
		
		str.Format("服务器已启动!(%s)",GetCurrentTime());
		m_pSrvView->ReceiveMsg(str);
	}
}

void CTypeSrvDoc::ReceiveUserInfo(LPCTSTR lpszHostName,LPCTSTR lpszID, LPCTSTR lpszName)
{
	if(m_pSrvView!=NULL)
	{
		CString str;
		str.Format("客户机[%s]已登陆考试系统!(%s)",lpszHostName,GetCurrentTime());
		m_pSrvView->ReceiveMsg(str);
		str.Format("%s号%s验证成功!",lpszID,lpszName);
		m_pSrvView->ReceiveMsg(str);
	}

	UpdateAllViews(NULL);
}

void CTypeSrvDoc::OnTypesrvLogout() 
{
	// TODO: Add your command handler code here
	if(m_pListenSocket==NULL)
	{
		SetTitle("网上服务器还没启动");
		return;
	}

	m_pListenSocket->Close();

	delete m_pListenSocket;
	m_pListenSocket=NULL;

	m_bLogin=FALSE;

	if(!SwitchToView(RUNTIME_CLASS(CMainView)))
	{
		return;
	}
	m_bShowMainView=TRUE;

	SetTitle("网上考试服务器已关闭");
}


void CTypeSrvDoc::OnQuestionDlg() 
{
	// TODO: Add your command handler code here
	CQuestionDlg dlg;
	dlg.DoModal();
}

void CTypeSrvDoc::ReceiveSaveScore(CString strID, CString strName, int nRate, int nSpeed)
{
	if(m_pSrvView!=NULL)
	{
		m_pSrvView->AddScore(strID,strName,nRate,nSpeed);
		
		CString str;
		str.Format("%s号%s已考完!(%s)",strID,strName,GetCurrentTime());
		m_pSrvView->ReceiveMsg(str);
	}

}

void CTypeSrvDoc::RefrushUserList(CStringList* pUserList)
{
	m_pSrvView->RefrushUserList(pUserList);
}

void CTypeSrvDoc::OnScoreDlg() 
{
	// TODO: Add your command handler code here
	CScoreDlg ScoreDlg;
	ScoreDlg.DoModal();

	if(m_bShowMainView)
	{
		m_pMainView->ShowAll();
	}
}

BOOL CTypeSrvDoc::SwitchToView(CRuntimeClass *pNewViewClass)
{
	CFrameWnd* pMainWnd=(CFrameWnd*)AfxGetMainWnd();
	CView* pOldActiveView=pMainWnd->GetActiveView();

	if(pOldActiveView->IsKindOf(pNewViewClass))
		return TRUE;

	::SetWindowLong(pOldActiveView->m_hWnd,GWL_ID,0);

	CCreateContext context;
	context.m_pNewViewClass=pNewViewClass;
	context.m_pCurrentFrame=pMainWnd;
	context.m_pNewDocTemplate = NULL;
	context.m_pCurrentDoc=this;

	CView* pNewView=STATIC_DOWNCAST(CView,pMainWnd->CreateView(&context));
	
	if(pNewView!=NULL)
	{
		pNewView->ShowWindow(SW_SHOW);
		pNewView->OnInitialUpdate();
		pMainWnd->SetActiveView(pNewView);
		pMainWnd->RecalcLayout();

		pOldActiveView->DestroyWindow();
		return TRUE;
	}
	return FALSE;

}


void CTypeSrvDoc::OnDataBackup() 
{
	// TODO: Add your command handler code here

	char buf[256];
	GetModuleFileName(NULL,buf,256);
	CString str=buf;
	int pos=str.ReverseFind('\\');
	CString sPath=str.Left(pos+1);
	CString sDataPath=sPath+"Data\\TypeData.mdb";
	CString sBackPath=sPath+"Data\\TypeData.bak";

	CString szFilter= "备份文件 (*.bak)|*.bak|所有文件 (*.*)|*.*||";
	CFileDialog dlg(FALSE,"*.bak","TypeData.bak",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
	
	if(dlg.DoModal()!=IDOK)
	{
		AfxMessageBox("数据备份失败!"); 	
		return;
	}
	
	sBackPath=dlg.GetPathName();
	
	if(CopyFile(sDataPath,sBackPath,FALSE)) 
	{
		AfxMessageBox("数据备份成功!"); 
	}
	else 
	{
		AfxMessageBox("数据备份失败!"); 	
	}
	
}

void CTypeSrvDoc::OnDataRecover() 
{
	// TODO: Add your command handler code here
	if(AfxMessageBox("还原数据库将覆盖原来的数据库。您确定要还原吗?",MB_OKCANCEL)==IDCANCEL) 
	{ 
		return; 
	}   
	
	char buf[256];
	GetModuleFileName(NULL,buf,256);
	CString str=buf;
	int pos=str.ReverseFind('\\');
	CString sPath=str.Left(pos+1);
	CString sDataPath=sPath+"Data\\TypeData.mdb";
	CString sBackPath=sPath+"Data\\TypeData.bak";

	CString szFilter= "备份文件 (*.bak)|*.bak|所有文件 (*.*)|*.*||";
	CFileDialog dlg(TRUE,"*.bak","TypeData.bak",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
	
	if(dlg.DoModal()!=IDOK)
	{
		AfxMessageBox("数据还原失败!"); 	
		return;
	}
	
	sBackPath=dlg.GetPathName();

	if(CopyFile(sBackPath,sDataPath,FALSE)) 
	{
		if(m_bShowMainView)
		{
			m_pMainView->ShowAll();
		}

		AfxMessageBox("数据还原成功!"); 
	}
	else 
	{
		AfxMessageBox("数据还原失败!"); 	
	}
}

void CTypeSrvDoc::OnUpdateTypesrvLogin(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(!m_bLogin)
	{
		pCmdUI->Enable(TRUE);
	}
	else
	{
		pCmdUI->Enable(FALSE);
	}
}

void CTypeSrvDoc::OnUpdateTypesrvLogout(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_bLogin)
	{
		pCmdUI->Enable(TRUE);
	}
	else
	{
		pCmdUI->Enable(FALSE);
	}
}

CString CTypeSrvDoc::GetCurrentTime()
{
	CTime tm=CTime::GetCurrentTime();
	CString str=tm.Format("%m-%d %H:%M:%S");
	return str;
}

void CTypeSrvDoc::ReceiveUserLogout(CString strID, CString strName)
{
	if(m_pSrvView!=NULL)
	{
		CString str;
		str.Format("%s号%s离开考试系统!(%s)",strID,strName,GetCurrentTime());
		m_pSrvView->ReceiveMsg(str);
	}
}


void CTypeSrvDoc::ReceiveClientClose(CString strHostName)
{
	if(m_pSrvView!=NULL)
	{
		CString str;
		str.Format("客户机[%s]断开连接!(%s)",strHostName,GetCurrentTime());
		m_pSrvView->ReceiveMsg(str);
	}
}